﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Modelo_ETdA.Negocio.Analise;
using Modelo_ETdA.Negocio.Analise.Formato;
using Modelo_ETdA.Negocio.Analise.Avaliacao;

namespace Modelo_ETdA.Interface
{
    public partial class RegistarAvaliacaoCliente : Form
    {
        MenuAnaliseETdA menuAetda;
        GestorAnalise gAnalise;
        FormatoAvaliacaoCliente form_cli;
        DataTable tabela;
        RegistarAvaliacaoCliente anterior;
        RegistarAvaliacaoCliente next;
        Boolean respondeu;

        private List<Questionario> l_quest;


        public RegistarAvaliacaoCliente(GestorAnalise gestor, FormatoAvaliacao formato, MenuAnaliseETdA metda, List<Questionario> lquest, RegistarAvaliacaoCliente ant, String nome)
        {
            InitializeComponent();
            this.gAnalise = gestor;
            if (lquest == null)
                this.l_quest = new List<Questionario>();
            else l_quest = lquest;
            anterior = ant;
            if (anterior == null)
                questAnt.Visible = false;
            else
            {
                label10.Visible = false;
                nomeAval.Visible = false;
            }
            if (next != null)
                guardar.Visible = false;

            this.nomeAval.Text = nome;
            this.form_cli = (FormatoAvaliacaoCliente)formato;
            nomeForm.Text = formato.Nome;
            preencheListaHabilitacoes();
            menuAetda = metda;

            tabela = new DataTable();
            tabela.Columns.Add("Código");
            tabela.Columns.Add("Questões");
            tabela.Columns.Add("Resposta");
            tabela.Columns.Add("Mínimo");
            tabela.Columns.Add("Máximo");
            DataRow row;
            foreach (QuestaoCliente quest in form_cli.ListQuestaoCliente)
            {
                row = tabela.NewRow();
                row[0] = quest.CodBD;
                row[1] = quest.Alcunha;
                row[3] = quest.EscalaMin;
                row[4] = quest.EscalaMax;
                tabela.Rows.Add(row);
            }
            lquestoes.DataSource = tabela;
            lquestoes.Columns[0].Visible = false;
            lquestoes.Columns[0].ReadOnly = true;
            lquestoes.Columns[1].ReadOnly = true;
            lquestoes.Columns[1].Width += 65;
            lquestoes.Columns[2].Width += 5;
            lquestoes.Columns[3].Width -= 30;
            lquestoes.Columns[4].Width -= 30;
            lquestoes.Columns[3].ReadOnly = true;
            lquestoes.Columns[4].ReadOnly = true;
            nquestionarios.Text = "" + (l_quest.Count + 1);

            respondeu = false;
        }

        private void guardar_Click(object sender, EventArgs e)
        {
            try
            {

                for (int j = 0; ((j < tabela.Rows.Count) && (!respondeu)); respondeu = tabela.Rows[j++][2].ToString().Length != 0) ;

                if (l_quest.Count < 0) { MessageBox.Show("Insira mais do que um questionário para ser possivel registar esta avaliação.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
                if (respondeu == false) { MessageBox.Show("É necessário inserir pelo menos um questionário com uma das questões respondidas.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }


                if (verificaSeRespondido())
                {
                    String desc_hab = habilitacoes.Text;

                    DocumentoCabecalho cab = new DocumentoCabecalho(nomeAval.Text, "Cliente", new DateTime(), 2);
                    int codHabili = getCodHabil(desc_hab);
                    if (codHabili == -1)
                    {
                        gAnalise.addHabilitacao(desc_hab);
                    }
                    int idade;
                    if (anos.Text.Length == 0) idade = -1;
                    else idade = Convert.ToInt32(anos.Text);

                    Questionario quest = new Questionario(form_cli.getCod(), cab, gAnalise.AmbComercialSessao.Cabeçalho.Cod, idade, masculino.Checked, cliente.Checked, getCodHabil(desc_hab));

                    quest.CodForm = form_cli.getCod();
                    List<Resposta> listaResp = daListaRespostas();
                    quest.Respostas = listaResp;
                    l_quest.Add(quest);

                    if (gAnalise.registListQuestionario(l_quest) == 0)
                    {
                        MessageBox.Show("Avaliação inserida com sucesso!", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        menuAetda.Visible = true;
                        this.Visible = false;
                    }
                    else MessageBox.Show("Avaliação inserida SEM sucesso!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao registar Avaliação!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public List<Resposta> daListaRespostas()
        {
            int linhas = tabela.Rows.Count;
            int i = 0;
            int val_resp;
            List<Resposta> lrespostas = new List<Resposta>();
            while (i < linhas)
            {
                if (tabela.Rows[i][2].ToString().Length == 0) val_resp = -1;
                else { val_resp = Convert.ToInt32(tabela.Rows[i][2]); respondeu = true; }
                Resposta resp = new Resposta(-1, Convert.ToInt32(tabela.Rows[i][0]), val_resp);
                lrespostas.Add(resp);
                i++;
            }
            return lrespostas;
        }


        private void preencheListaHabilitacoes()
        {
            List<Habilitacao> lista = gAnalise.getListHabilitacaoLiteraria();

            foreach (Habilitacao hab in lista)
            {
                habilitacoes.Items.Add(hab.descricao);
            }
        }

        private void novoQuestionario_Click(object sender, EventArgs e)
        {
            try{
            if (verificaSeRespondido() == false) return;
            String desc_hab = habilitacoes.Text;
            DocumentoCabecalho cab = new DocumentoCabecalho(nomeAval.Text, "Cliente", new DateTime(), 2);
            int codHabili = getCodHabil(desc_hab);
            if (codHabili == -1)
            {
                if (desc_hab.Trim().Length == 0) gAnalise.addHabilitacao("Não Indicada");
                else gAnalise.addHabilitacao(desc_hab);
            }
            int idade;
            if (anos.Text.Length == 0) idade = -1;
            else idade = Convert.ToInt32(anos.Text);


            Questionario quest = new Questionario(form_cli.getCod(), cab, gAnalise.AmbComercialSessao.Cabeçalho.Cod, idade, masculino.Checked, cliente.Checked, getCodHabil(desc_hab));
            quest.CodForm = form_cli.getCod();
            List<Resposta> listaResp = daListaRespostas();
            quest.Respostas = listaResp;
            l_quest.Add(quest);

            if (next == null)
                next = new RegistarAvaliacaoCliente(gAnalise, form_cli, menuAetda, l_quest, this, nomeAval.Text);

            next.Visible = true;
            this.Visible = false;
            }
            catch (Exception exp)
            {
                MessageBox.Show("erro ao carregar novo questionário!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void resetCampos()
        {
            anos.Text = "";
            masculino.Checked = true;
            feminino.Checked = false;
            habilitacoes.Items.Clear();
            preencheListaHabilitacoes();
            lquestoes.FirstDisplayedScrollingRowIndex = 0;
            nquestionarios.Text = "" + (l_quest.Count + 1);
            limpaRespostas();
            habilitacoes.Text = "";
        }


        private int getCodHabil(String desc)
        {
            List<Habilitacao> lista;
            lista = gAnalise.getListHabilitacaoLiteraria();
            int ret = -1;

            foreach (Habilitacao hab in lista)
            {
                if (hab.descricao.CompareTo(desc) == 0)
                {
                    ret = hab.Cod;
                    break;
                }
            }

            return ret;

        }

        private void RegistarAvaliacaoCliente_FormClosed(object sender, FormClosedEventArgs e)
        {
            menuAetda.sair();
        }

        private void lquestoes_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            int linha, coluna;
            linha = e.RowIndex;
            coluna = e.ColumnIndex;
            try
            {
                if (Convert.ToInt32(tabela.Rows[linha][coluna]) < Convert.ToInt32(tabela.Rows[linha][coluna + 1]) || Convert.ToInt32(tabela.Rows[linha][coluna]) > Convert.ToInt32(tabela.Rows[linha][coluna + 2]))
                {
                    MessageBox.Show("O valor não está dentro dos valores esperados! Para esta Questão o valor mínimo é " + Convert.ToInt32(tabela.Rows[linha][coluna + 1]) + " e o valor máximo " + Convert.ToInt32(tabela.Rows[linha][coluna + 2]) + "!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    tabela.Rows[linha][coluna] = "";
                    return;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Inseriu valores inválidos!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                tabela.Rows[linha][coluna] = "";
            }


        }

        public bool verificaSeRespondido()
        {
            int linhas = tabela.Rows.Count;
            int i = 0;
            try
            {
                if (anos.Text.Length > 0) Convert.ToInt32(anos.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show("O campo idade tem valores inválidos!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                anos.Text = "";
                return false;
            }

            if (nomeAval.TextLength == 0)
            {
                MessageBox.Show("Não preencheu o campo nome!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }


            while (i < linhas)
            {
                if (tabela.Rows[i][2].ToString().Length == 0)
                {
                    MessageBox.Show("Não preencheu todas as respostas!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
                i++;
            }
            return true;
        }

        public void limpaRespostas()
        {
            int i = 0, linhas = tabela.Rows.Count;

            while (i < linhas)
            {
                tabela.Rows[i][2] = "";
                i++;
            }
        }

        private void voltar_Click(object sender, EventArgs e)
        {
            menuAetda.Visible = true;
            this.Visible = false;
        }

        private void questAnt_Click(object sender, EventArgs e)
        {
            try{
            anterior.Visible = true;
            this.Visible = false;
            l_quest.RemoveAt(l_quest.Count - 1);
            }
            catch (Exception exp)
            {
                MessageBox.Show("Impossível mostrar questionário anterior!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

    }
}
